package org.brisling.workflow.util;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.brisling.base.domain.inf.BaseFlowDomainInf;
import org.brisling.common.SysConfig;
import org.brisling.common.util.LongUtil;
import org.brisling.common.util.MapUtil;
import org.brisling.common.util.ReflectDataUtil;

/**
 * 流程节点用户信息获取并封装
 * <p>Title: NodeUser</p>
 * <p>Description: </p>
 * <p>Company: tongking</p>
 * @author jackson wang
 * @since 1.0
 * @version 1.0
 * @date 2017年2月9日 下午7:32:58
 */
public class NodeUser {

	private static NodeUser nodeUser;
	
	private NodeUser(){}
	
	public static NodeUser getInstance(){
		if(nodeUser==null){
			nodeUser = new NodeUser();
		}
		return nodeUser;
	}
	
	/**
	 * 获取字段用户条件配置
	 * @param inMap		配置信息
	 * @param userMap	用户信息
	 * @param inquiry	业务实体
	 */
	public static Map<String,String> getFieldUser( Map<String,String> inMap,Map<String,String> userMap,Object inquiry){
		
		
		//获取字段条件字段值
	  	if(inMap!=null && !inMap.isEmpty()){
	  		
	  		userMap = MapUtil.getReflectFiedCondition(inMap,inquiry, "dept", "deptid",userMap);	  		
	  		
	  		userMap = MapUtil.getReflectFiedCondition(inMap, inquiry,"user", "userid",userMap);
	  		
	  		userMap = MapUtil.getReflectFiedCondition(inMap, inquiry,"defaultUser", "userid",userMap);
	  			  		
	  	}
	  	return userMap;
	}
	
	/**
	 * 获取字段用户条件配置
	 * @param inMap		配置信息
	 * @param userMap	用户信息
	 * @param inquiry	业务实体
	 */
	public static Map<String,String> getRoleUser( Map<String,String> inMap,Map<String,String> userMap,Object inquiry){
		//获取人员条件字段值
	  	if(inMap!=null && !inMap.isEmpty()){
	  		userMap = MapUtil.getMapCondition(inMap, "role", "roleid_in",userMap);
	  		
	  		
	  		userMap = MapUtil.getMapCondition(inMap, "job_role", "jobcode_in",userMap);
	  		
	  		
	  		userMap = MapUtil.getMapCondition(inMap, "title_role", "titlecode_in",userMap);
	  		
	  		userMap = MapUtil.getMapCondition(inMap, "user", "userid_in",userMap);		  		
	  	}
		return userMap;
	}
	
	/**
	 * 获取业务分管领导条件配置
	 * @param inMap
	 * @param userMap
	 * @param inquiry
	 * @return
	 */
	public static Map<String,String> getBizLeaderUser(Map<String,String> inMap,Map<String,String> userMap,Object inquiry){
		if(inMap!=null && inMap.containsKey("biz")){
  			String _bizLeader = inMap.get("biz");
  			if(_bizLeader!=null){
  				//判断是否为数值参数
  				if( NumberUtils.isDigits(StringUtils.replace(_bizLeader, ",", ""))){
  				
  					//数值参数，直接添加过滤条件
  					
  					userMap.put("userid_in", _bizLeader);
  				}else{
  					//反射获取实体对应字段业务代码值
  					Object obj =ReflectDataUtil.getFieldValue(_bizLeader,inquiry);
  		  			if((obj!=null) && (obj.toString().trim().length()>0)){
  		  				
  		  				String _tfd = obj.toString().trim();
  		  				
  		  				//获取缓存中业务代码对应业务资源主管领导
  		  				String _uid = SysConfig.getBizLeaderIds(_tfd);
  		  				
  		  				if(_uid!=null && _uid.trim().length()>0){
  		  					userMap.put("userid_in", _uid);
  		  				}
  		  					  							
  		  			}
  				}
  			}
  		}
		return userMap;
	}
	
	
	/**
	 * 获取主管领导条件配置
	 * @param inMap
	 * @param userMap
	 * @param inquiry
	 * @return
	 */
	public static Map<String,String> getLeaderUser(Map<String,String> leaderMap,Map<String,String> userMap,Object inquiry){
		//获取主管、分管领导过滤条件
	  	if(leaderMap!=null && !leaderMap.isEmpty()){
	  		//判断主管领导
	  		if(leaderMap.containsKey("direct")){
	  			String _directLeader = leaderMap.get("direct");
	  			if(_directLeader!=null){
	  				//判断是否为数值参数
	  				if( NumberUtils.isDigits(StringUtils.replace(_directLeader, ",", ""))){
	  				
	  					userMap.put("userid_in", _directLeader);
	  				}else{
	  					//反射获取实体对应字段部门值
	  					Object obj =ReflectDataUtil.getFieldValue(_directLeader,inquiry);
	  		  			if((obj!=null) && (obj.toString().trim().length()>0)){
	  		  				//判断部门值是否为数值
	  		  				Long _id = LongUtil.getLongValue(obj.toString(), null);
	  		  				if(_id!=null){
	  		  					
	  		  					//字段值为单一部门值，获取缓存中部门值所对应扩展信息实体
	  		  					String _tid = SysConfig.getDeptLeaderIds(_id);
		  		  				if(_tid!=null && _tid.trim().length()>0){					  		  						
		  		  				userMap.put("userid_in", _tid);					  		  						
  		  						}		  		  					
	  		  						
	  		  				}else{
	  		  					getInstance();
								//判断字段值是否为部门值集合
	  		  					NodeUser.getInstance();
								String _lids = NodeUser.getLeaderIdsByDeptids(obj.toString());
	  		  					if(_lids!=null){
	  		  						userMap.put("userid_in", _lids);
	  		  					}
		  		  				
	  		  				}
	  		  					  							
	  		  			}
	  				}
	  			}
	  		}
	  	}
		return userMap;
	}
	
	/**
	 * 根据部门id集合获取相应部门主管领导id集合
	 * @param deptids
	 * @return
	 */
	private static String getLeaderIdsByDeptids(String deptids){
		
		//临时存储部门主管领导id
		String _lids = null;
		
		//判断字段值是否为部门值集合
		if( NumberUtils.isDigits(StringUtils.replace(deptids, ",", ""))){
			//部门集合
			String[] _ids = deptids.trim().split(",");
			
			//循环查找字段值所包含部门的主管领导id
			for(String _deptid:_ids){
				Long _did = LongUtil.getLongValue(_deptid, null);
				if(_did!=null){
					//获取缓存中部门值所对应扩展信息实体中主管领导id值
					String _tid = SysConfig.getDeptLeaderIds(_did);
					if(_tid!=null && _tid.trim().length()>0){					  		  						
  						_lids = _lids==null?_tid:_lids+","+_tid;					  		  						
					}
				}
			}
			
		}
		return _lids;
	}
	
}
